TD2 : Pong ********** L'objectif de cet TD est d'étudier et de modéliser des rebonds simples contre les bords du jeu. Nous étudierons le jeu Pong qui fut un dès tout premier jeu disponible sous console. .. raw:: html

Le jeu Pong sur Console ATARI

Mise en place ============= Téléchargez le source du projet :download:`Pong`. Ouvrez et lancez ce programme. Vous devriez voir ceci : .. image:: demo.gif :scale: 60% :align: center La raquette peut être déplacée avec les touches flèches Haut et Bas. Le rebond sur le bord haut est programmé ainsi que la détection de collision sur la raquette. Le rebond sur le bord bas est inexistant. La balle disparaît à jamais ! Notions clefs ============= Rebond sur le haut de l’écran ----------------------------- Dans l’exercice précédent, le palet rebondissait contre les bords de l’écran lorsque son centre touchait les bords. Cela était peu réaliste car on ne tenait pas du tout compte de la l’épaisseur du palet. Nous expliquons ci-dessous comment gérer cette question : .. image:: rebond.png :scale: 40% :align: center .. warning:: Contrairement au repère cartésien habituel, le centre du repère (0,0) se trouve en haut à gauche. L’axe des X est orienté de la même manière, mais l’axe des Y lui est orienté vers le bas. Ainsi, un pixel se trouvant en haut de l’écran a une ordonnée égale à 0. La variable correspondant au rayon de la boule s’appelle *ball_radius*. La collision en haut de l’écran est détectée lorsque la composante en *y* de la balle : *ball_y* devient inférieure à *ball_radius*. Ainsi lorsque *ball_y < ball_radius*, on détecte que la balle est « virtuellement » rentrée dans le mur . Dans ce cas, on inverse le signe la composante en *y* de la vitesse de la balle : *vit_y*. Nous pouvons aussi corriger la position de la balle qui n’aurait jamais dû rentrer dans le mur en réinitialisant *ball_y* à la valeur *ball_radius*, cette correction n’est pas totalement exacte, mais pour l’instant, cela suffira. Rebond contre la raquette de gauche ----------------------------------- La logique reste la même que précédemment. Cependant, la configuration est un peu plus complexe. Il faut prendre en compte à la fois : la distance entre la raquette et le mur, l’épaisseur de la raquette et le rayon de la boule. Une fois que la composante en *x* de la balle est inférieure à cette grandeur, on sait qu’une collision s’est produite. Pour effectuer un rebond sur un bord vertical, il suffit d’inverser le signe de la composante en *x* de la vitesse de la balle, ainsi elle repart dans l’autre sens. Pour éviter toute forme de bug, on réinitialise la position *x* de la balle à la position de contact idéal entre la raquette et la balle. .. image:: raquette.png :scale: 30% :align: center Afficher du texte ----------------- Contrairement aux autres fonctions de dessin, l’écriture de texte se fait en trois étapes. D’abord il faut choisir la police utilisée, ainsi que sa taille, c’est le rôle de la ligne suivante : .. code-block:: police = pygame.font.SysFont("arial", 15) Ensuite, on dessine le texte à afficher dans une zone à part, il ne s’agit pas de l’écran mais d’une zone tampon dans laquelle le texte est dessiné. Cette zone est créée pour contenir le texte demandé : .. code-block:: zone = police.render( str(score_player1)+" : " + str(score_player2), True, GREEN) En dernière étape, on affiche la zone de texte sur l’écran de jeu grâce à la fonction *BitBlt* : .. code-block:: screen.blit(zone,(300,10)) To-do List ========== * Positionnez les deux raquettes à mi-hauteur dès le début du jeu * Faîtes en sorte que les deux palets ne sortent ni par le bas, ni par le haut de l’écran * Gérez le rebond de la balle contre le bas de l’écran * Utilisez les touches du clavier A et Q pour faire bouger le 2ème palet de haut en bas * Gérez la collision de la balle ainsi que son rebond sur le palet de droite * Inspirez-vous du code du palet de gauche déjà fourni * Gérez la sortie du palet : lorsque le palet n’est plus visible à l’écran, un des joueurs gagne 1 point * Réinitialisez la vitesse de la balle ainsi que sa position au centre de l’écran * Lorsqu’un joueur obtient trois points, affichez indéfiniment « JOUEUR 1 GAGNANT » * En grosses lettres jaunes, au centre de l’écran sur fond rouge * Une fois la partie terminée, on ne gère pas le redémarrage